home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok46
/
programme
/
objektdemo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
232 lines
(*
* -------------------------------------------------------------------------
*
* :Program. ObjektDemo
* :Contents. Demonstration der IntuitionObjekte
* :Author. Reiner Nix
* :Address. Geranienhof 2, 5000 Köln 71 Seeberg
* :Copyright. Public Domain
* :Language. Modula-2
* :Translator. M2Amiga A-L V3.3d
* :History. V1.0 21.11.90
* :Imports. IntuitionTools siehe diese Diskette
* :Imports. Amigagraphik siehe diese Diskette
* :Imports. IntuitionObjekte siehe diese Diskette
*
* -------------------------------------------------------------------------
*)
MODULE ObjektDemo;
FROM SYSTEM IMPORT ADR;
FROM Arts IMPORT Assert, TermProcedure;
FROM Exec IMPORT WaitPort, GetMsg, ReplyMsg;
FROM Intuition IMPORT NewWindow,
IntuiMessage, IntuiMessagePtr,
IDCMPFlags, IDCMPFlagSet,
WindowFlags, WindowFlagSet,
ScreenFlags, ScreenFlagSet,
WindowPtr;
FROM IntuitionTools IMPORT initNewWindow;
FROM AmigaGraphik IMPORT OpenWindow, CloseWindow, UseWindow,
NewWindowSize, Move,
WriteString, WriteCard;
FROM IntuitionObjekte IMPORT ObjektEreignis, ObjektTyp,
ObjektPtr,
verarbeiteNachricht, aenderInfoSatz,
frageHPosition, frageVPosition,
setzeHPosition, setzeVPosition,
frageObjektNr, findeObjekt,
EingabeOk, erzeugeBooleanObjekt,
erzeugeHPropObjekt, erzeugeVPropObjekt,
erzeugeTextObjekt, erzeugeRealObjekt,
verbindeObjekte, loescheAlleObjekte;
CONST keinFenster ="AusgabeFenster ist nicht zu öffnen!";
Programmname ="ObjektDemo";
BoolWechselID =1;
BoolMeldenID =2;
BoolWiederholenID =3;
HorizontalID =4;
VertikalID =5;
TextID =6;
ZahlID =7;
maxX =MAX (CARDINAL) DIV 70;
maxY =MAX (CARDINAL) DIV 30;
VAR Programmende :BOOLEAN;
Fenster :WindowPtr;
NachrichtPtr :IntuiMessagePtr;
Nachricht :IntuiMessage;
Text :ARRAY [0..51] OF CHAR;
Zahl :REAL;
X, Y :CARDINAL;
PROCEDURE oeffneFenster (VAR Fenster :WindowPtr);
VAR neuFenster :NewWindow;
BEGIN
initNewWindow (neuFenster,
0,12, 640,244,
0,1,
IDCMPFlagSet {closeWindow, newSize, sizeVerify},
WindowFlagSet {windowSizing, windowDrag, windowDepth,
noCareRefresh, windowClose},
NIL, (* firstGadget *)
NIL, (* Checkmark *)
ADR (Programmname),
NIL, (* Screen *)
NIL, (* Bitmap *)
50, 25, -1,-1,
ScreenFlagSet {wbenchScreen});
Fenster := OpenWindow (neuFenster);
Assert (Fenster # NIL, ADR (keinFenster))
END oeffneFenster;
PROCEDURE schreibeAusgabe;
BEGIN
UseWindow (Fenster);
Move (20, 200); WriteString ("Horizontalwert ="); WriteCard (X,5);
Move (20, 210); WriteString ("Vertikalwert ="); WriteCard (Y,5)
END schreibeAusgabe;
PROCEDURE WechselAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
IF Ereignis = An THEN
aenderInfoSatz (objekt," Aua! ")
ELSE
aenderInfoSatz (objekt," So ist gut. ")
END
END WechselAktion;
PROCEDURE MeldeAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
IF X <= MAX (CARDINAL)-500 THEN
INC (X, 500);
setzeHPosition (findeObjekt (Fenster, HorizontalID), X, maxX);
schreibeAusgabe
END
END MeldeAktion;
PROCEDURE WiederholungsAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
IF Y >= MIN (CARDINAL)+500 THEN
DEC (Y, 500);
setzeVPosition (findeObjekt (Fenster, VertikalID), Y, maxY);
schreibeAusgabe
END;
END WiederholungsAktion;
PROCEDURE PropAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
CASE frageObjektNr (objekt) OF
| HorizontalID :X := frageHPosition (objekt)
| VertikalID :Y := frageVPosition (objekt)
ELSE
END;
schreibeAusgabe
END PropAktion;
PROCEDURE pruefeZahl ( objekt :ObjektPtr) :BOOLEAN;
BEGIN
UseWindow (Fenster);
Move (20, 225);
IF (7.0 < Zahl) AND (Zahl < 7.77E2) THEN
WriteString (" ");
RETURN TRUE
ELSE
WriteString ("Bitte geben Sie eine Zahl zwischen 7 und 777 ein.");
RETURN FALSE
END
END pruefeZahl;
PROCEDURE erstelleObjekte;
BEGIN
Text := "Hallo";
Zahl := 3.1415926;
X := 0;
Y := 20000;
erzeugeBooleanObjekt (Fenster, 100, 50, " Drück mich ", BoolWechselID,
wechseln, WechselAktion);
erzeugeBooleanObjekt (Fenster, 100, 70, " Melden ", BoolMeldenID,
melden, MeldeAktion);
erzeugeBooleanObjekt (Fenster, 100, 90, " Wiederholen ", BoolWiederholenID,
wiederholen, WiederholungsAktion);
erzeugeHPropObjekt (Fenster, 100,100, 104,8, X,maxX, HorizontalID, wiederholen,
PropAktion);
erzeugeVPropObjekt (Fenster, 80, 50, 16,50, Y,maxY, VertikalID, wiederholen,
PropAktion);
erzeugeTextObjekt (Fenster, 400, 50, "Textobjekt :", TextID, -150,0,
20, 50, EingabeOk, Text);
erzeugeRealObjekt (Fenster, 400, 70, "Zahlobjekt :", ZahlID, -150,0,
12,2, TRUE, pruefeZahl, Zahl);
verbindeObjekte (Fenster, TextID, -1, ZahlID, -1, -1);
verbindeObjekte (Fenster, ZahlID, TextID, -1, -1, -1)
END erstelleObjekte;
PROCEDURE stopObjektDemo;
BEGIN
loescheAlleObjekte (Fenster);
CloseWindow (Fenster)
END stopObjektDemo;
(* MODULE ObjektDemo *)
BEGIN
Fenster := NIL;
TermProcedure (stopObjektDemo);
Programmende := FALSE;
oeffneFenster (Fenster);
erstelleObjekte;
WHILE NOT Programmende DO
WaitPort (Fenster^.userPort);
REPEAT
NachrichtPtr := GetMsg (Fenster^.userPort);
IF NachrichtPtr # NIL THEN
Nachricht := NachrichtPtr^;
ReplyMsg (NachrichtPtr);
verarbeiteNachricht (Fenster, Nachricht);
IF closeWindow IN Nachricht.class THEN
Programmende := TRUE
ELSIF newSize IN Nachricht.class THEN
NewWindowSize;
schreibeAusgabe;
ELSIF sizeVerify IN Nachricht.class THEN
(* keine Aktion, Intuition wartet bis die Nachricht zurückgegeben ist *)
(* ändert erst dann die Fenstergröße und gibt die Nachricht newSize, *)
(* so bleiben während einer Programmausgabe die Fenstermaße konstant. *)
END
END
UNTIL (NachrichtPtr = NIL) OR Programmende
END
END ObjektDemo.